﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EcodexIntegrationSample;
using System.Configuration;
using System.IO;

namespace EcodexIntegrationSample.Utils
{
    class SelladoOpenSSL
    {
        static String PathOpenSSl
        {
            get
            {
                return ConfigurationManager.AppSettings["sslFolder"];
            }
        }

        static String PathTrabajoGral
        {
            get
            {
                return @"..\..\Files\";
            }
        }


        public static String Sella(String rfc, String noCertificado, String cadenaOriginal)
        {
            String PathCadenaOri = PathTrabajoGral + @"\" + Guid.NewGuid().ToString() + ".CO";
            File.WriteAllText(PathCadenaOri, cadenaOriginal);


            String CertId = Certificado.GetCertId(rfc, noCertificado);
            String PathCertificadoSello = Path.GetFullPath(String.Format("{0}{1}.pem", Certificado.PathCertificados, CertId));

            String PathCompletoCadenaOri = Path.GetFullPath(PathCadenaOri);
            String PathTrabajo =  Path.GetDirectoryName( Path.GetFullPath(PathCadenaOri));
            String FileName = Path.GetFileNameWithoutExtension(PathCadenaOri);
                       
            String FilePathBin = PathTrabajo + @"\" + FileName + ".bin";

            String Sellado1 = String.Format("/C {0}openssl dgst -sha1 -out \"{3}\" -sign \"{1}\" \"{2}\"",
                PathOpenSSl,  PathCertificadoSello, PathCompletoCadenaOri, FilePathBin);
            Utils.Cmd.Ejecuta(Sellado1);

            String Sellado2 = String.Format("/C {0}openssl enc -in \"{1}\" -a -A", PathOpenSSl, FilePathBin);
            var resultado = Utils.Cmd.Ejecuta(Sellado2);

            /* Borrar los archivos auxiliares */
            File.Delete(FilePathBin);
            File.Delete(PathCompletoCadenaOri);

            //Verificar si se obtuvo un resultado diferente de nulo o vacio
            if (!String.IsNullOrEmpty(resultado))            
                return resultado;
            else
                throw new Exception("Error al sellar el comprobante");                        
        }
    }
}
